package business.sistema;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import business.dados.Persistente;
import business.seguranca.Usuario;
import business.util.Menssagens;

public class ObjetoSistema implements IObjetoSistema, Cloneable, Serializable
{
	private static final long serialVersionUID = 3216203711894457179L;
	private Date dataCadastro = null;
	private int codigoUsuario;
	private boolean editado;
	
	/**
	 * @return the codigoUsuario
	 */
	public int getCodigoUsuario() 
	{
		return codigoUsuario;
	}

	/**
	 * @param codigoUsuario the codigoUsuario to set
	 */
	public void setCodigoUsuario(int codigoUsuario) 
	{
		this.codigoUsuario = codigoUsuario;
	}

	/**
	 * 
	 */
	public void salvar() 
	{
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			
			if(Usuario.getUsuarioSessao() != null)
			{
				setCodigoUsuario(Usuario.getUsuarioSessao().getCodigo());
			}
			
			dataCadastro = new Date();
			
			objPersistente.save(this);
			JOptionPane.showMessageDialog(null, Menssagens.confirmarSucesso);
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex); 
		}
	}
	
	public String salvarWEB() 
	{
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			
			if(Usuario.getUsuarioSessao() != null)
			{
				setCodigoUsuario(Usuario.getUsuarioSessao().getCodigo());
			}
			
			dataCadastro = new Date();
			
			objPersistente.save(this);
		}
		catch(Exception ex)
		{
			ex.printStackTrace(); 
		}
		
		return Menssagens.sucesso;
	}
	
	/**
	 * Salva porem não confirma.
	 */
	public void salvarSemConfirmacao()
	{
		try
		{
			Persistente objPersistente = Persistente.getInstance();	
			
			if(Usuario.getUsuarioSessao() != null)
			{
				setCodigoUsuario(Usuario.getUsuarioSessao().getCodigo());
			}
			
			dataCadastro = new Date();
			
			objPersistente.save(this);
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex); 
		}
	}
	 
	/**
	 * 
	 */
	public void alterar() 
	{
		this.salvar();
	}
	 
	/**
	 * 
	 */
	public void excluir() throws Exception
	{
		Persistente objPersistente = Persistente.getInstance();
		objPersistente.Remove(this);
		JOptionPane.showMessageDialog(null, Menssagens.confirmarSucesso);
	}
	
	/**
	 * 
	 */
	public String excluirWEB()
	{
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			objPersistente.Remove(this);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		return Menssagens.sucesso;
	}
	 
	/**
	 * 
	 */
	public List<IObjetoSistema> obterTodos() 
	{
		List<IObjetoSistema> listaRetorno = new ArrayList<IObjetoSistema>();
		
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			
			listaRetorno = objPersistente.getCollection(this.getClass(), "");
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		return listaRetorno;
	}
	 
	/**
	 * 
	 */
	public List<IObjetoSistema> obterTodosPorFiltro(String descricaoConsulta) 
	{
		List<IObjetoSistema> listaRetorno = new ArrayList<IObjetoSistema>();
		
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			
			listaRetorno = objPersistente.getCollection(this.getClass(), descricaoConsulta);
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		return listaRetorno;
	}

	/**
	 * 
	 */
	public IObjetoSistema obterObjeto(int identificador) 
	{
		IObjetoSistema objetoRetorno = new ObjetoSistema();
		
		try
		{
			Persistente objPersistente = Persistente.getInstance();
			objetoRetorno = objPersistente.getObject(this, identificador);
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		return objetoRetorno;
	}

	/**
	 * 
	 * 
	 * @return
	 */
	public Date getDataCadastro() 
	{		
		return dataCadastro;
	}

	/**
	 * 
	 * 
	 * @param dataCadastro
	 */
	public void setDataCadastro(Date dataCadastro) 
	{
		this.dataCadastro = dataCadastro;
	}
	
	/**
	 * 
	 */
	public void desfazerModificacao() throws Exception
	{
		try
		{
			Persistente persistente = Persistente.getInstance();
			
			persistente.desfazerModificacao(this);
		}
		catch(Exception ex)
		{
			throw new Exception(Menssagens.errCancelamento);
		}
	}

	/**
	 * 
	 * @return editado
	 */
	@Override
	public boolean isEditado() 
	{
		return editado;
	}

	/**
	 * 
	 * @param editado
	 */
	@Override
	public void setEditado(boolean editado) 
	{
		this.editado = editado;		
	}
}
 
